package handler

import (
	"github.com/starmotioncf/soutchatinternal/dto"
	"github.com/starmotioncf/soutchatinternal/errcode"
	"github.com/starmotioncf/soutchatinternal/resp"
	"github.com/starmotioncf/soutchatinternal/service"

	"github.com/gin-gonic/gin"
)

type AccountHandler struct {
	*Handler
	accountService service.AccountService
}

func NewAccountHandler(h *Handler, accountService service.AccountService) *AccountHandler {
	return &AccountHandler{
		Handler:        h,
		accountService: accountService,
	}
}

// LoginByThird 第三方登录
// @Tags 账户
// @Summary  第三方登录
// @Accept json
// @param json body dto.LoginByThirdReq true "请求数据"
// @Produce  json
// @Response 200 {object} resp.Resp{data=dto.LoginRes}
// @Router /third_login [post]
// @Security Bearer
func (h *AccountHandler) LoginByThird(ctx *gin.Context) {
	req := dto.LoginByThirdReq{}
	if err := ctx.BindJSON(&req); err != nil {
		resp.Error(ctx, errcode.ErrInvalidParams.Wrap(err))
		return
	}
	data, err := h.accountService.LoginByThird(ctx, &req)
	resp.ReturnMustJson(ctx, data, err)
}

// LoginByPhoneAndPwd 手机号加密码登录
// @Tags 账户
// @Summary  手机号加密码登录
// @Accept json
// @param json body dto.LoginByPhoneAndPwdReq true "请求数据"
// @Produce  json
// @Response 200 {object} resp.Resp{data=dto.LoginRes}
// @Router /login [post]
// @Security Bearer
func (h *AccountHandler) LoginByPhoneAndPwd(ctx *gin.Context) {
	req := dto.LoginByPhoneAndPwdReq{}
	if err := ctx.BindJSON(&req); err != nil {
		resp.Error(ctx, errcode.ErrInvalidParams.Wrap(err))
		return
	}
	data, err := h.accountService.LoginByPhoneAndPwd(ctx, &req)
	resp.ReturnMustJson(ctx, data, err)
}

// LoginByPhoneAndCaptcha 验证码登录
// @Tags 账户
// @Summary  手机验证码登录
// @Accept json
// @param json body dto.LoginByPhoneAndCaptchaReq true "请求数据"
// @Produce  json
// @Response 200 {object} resp.Resp{data=dto.LoginRes}
// @Router /sms_login [post]
// @Security Bearer
func (h *AccountHandler) LoginByPhoneAndCaptcha(ctx *gin.Context) {
	req := dto.LoginByPhoneAndCaptchaReq{}
	if err := ctx.BindJSON(&req); err != nil {
		resp.Error(ctx, errcode.ErrInvalidParams.Wrap(err))
		return
	}
	data, err := h.accountService.LoginByPhoneAndCaptcha(ctx, &req)
	resp.ReturnMustJson(ctx, data, err)
}

// ResetPwd 修改密码
// @Tags 账户
// @Summary  修改密码
// @Accept json
// @param json body dto.AccountResetPwdReq true "请求数据"
// @Produce  json
// @Response 200 {object} resp.Resp
// @Router /reset_password [put]
// @Security Bearer
func (h *AccountHandler) ResetPwd(ctx *gin.Context) {
	resp.Success(ctx, nil)
}

// RefreshToken 刷新token
// @Tags 账户
// @Summary  刷新token
// @Accept json
// @param json body dto.AccountRefreshTokenReq true "请求数据"
// @Produce  json
// @Response 200 {object} resp.Resp{data=dto.LoginRes}
// @Router /refresh_token [post]
// @Security Bearer
func (h *AccountHandler) RefreshToken(ctx *gin.Context) {
	req := dto.AccountRefreshTokenReq{}
	if err := ctx.BindJSON(&req); err != nil {
		resp.Error(ctx, errcode.ErrInvalidParams.Wrap(err))
		return
	}
	data, err := h.accountService.RefreshToken(ctx, &req)
	resp.ReturnMustJson(ctx, data, err)
}

// Logout 退出
// @Tags 账户
// @Summary  用户退出
// @Router /logout [post]
// @Security Bearer
func (h *AccountHandler) Logout(ctx *gin.Context) {
	resp.Success(ctx, nil)
}

// Deregister 注销账户
// @Tags 账户
// @Summary  注销账户
// @Router /deregister [delete]
// @Security Bearer
func (h *AccountHandler) Deregister(ctx *gin.Context) {
	resp.Success(ctx, nil)
}

// CheckMobilePhone 检查手机号注册情况
// @Tags 账户
// @Summary  检查手机号注册情况
// @Accept json
// @param json body dto.MobilePhone true "请求数据"
// @Produce  json
// @Response 200 {object} resp.Resp{data=dto.CheckMobilePhoneRes}
// @Router /mobile_phone/check [put]
func (h *AccountHandler) CheckMobilePhone(ctx *gin.Context) {
	req := dto.MobilePhone{}
	if err := ctx.BindJSON(&req); err != nil {
		resp.Error(ctx, errcode.ErrInvalidParams.Wrap(err))
		return
	}
	data, err := h.accountService.CheckMobilePhone(ctx, &req)
	resp.ReturnMustJson(ctx, data, err)
}

// GetProfile 获取登陆用户的基本信息
// @Tags 账户
// @Summary  获取登陆用户的基本信息
// @Produce  json
// @Response 200 {object} resp.Resp{data=dto.AccountProfile}
// @Router /profile [get]
// @Security Bearer
func (h *AccountHandler) GetProfile(ctx *gin.Context) {
	data, err := h.accountService.GetProfile(ctx)
	resp.ReturnMustJson(ctx, data, err)
}
